package cn.adelyn.blog.blogmanager.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.ThreadPoolExecutor;

/**
 * @author chengze
 * @date 2023/2/7
 * @desc 自定义线程池
 */
@EnableAsync
@Configuration
public class ThreadPoolConfig {

    /**
     *  线程池中的线程数目达到corePoolSize后，就会把到达的任务放到缓存队列当中；
     *  若队列满了，继续创建线程，线程数量大于等于maxPoolSize后，开始使用拒绝策略拒绝
     */
    @Bean("blogManageExecutor") // bean的名称，默认为首字母小写的方法名
    public ThreadPoolTaskExecutor blogManageExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        // 核心线程数（默认线程数）
        executor.setCorePoolSize(5);
        // 缓冲队列大小 如果子线程进入了缓冲队列，父线程一直等待，容易造成死锁
        executor.setQueueCapacity(0);
        // 最大线程数 ttl无法传递给线程池中新建的线程，
        executor.setMaxPoolSize(50);
        // 允许核心线程外线程的空闲时间（单位：默认为秒）
        executor.setKeepAliveSeconds(10);
//        executor.setAllowCoreThreadTimeOut(true);
        // 线程池名前缀
        executor.setThreadNamePrefix("insertBlog-");

        // 线程池对拒绝任务的处理策略
        // CallerRunsPolicy：由调用线程（提交任务的线程）处理该任务
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
        // 初始化
        executor.initialize();

        return executor;
    }
}
